package com.aswifter.material.widget;
import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.animation.Animation;
import com.aswifter.material.utils.DisplayUtil;
public class RefreshLayout extends PullToRefreshLayout {
private final int mTouchSlop;
private OnLoadListener mOnLoadListener;
private float mInitialDownY;
private boolean mIsBeingDragged;
private boolean isLoading = false;
public RefreshLayout(Context context) {
this(context, null);
}
public RefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
initListener();
}
private void initListener(){
mRefreshListener = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if(!isLoading){
if (isRefreshing()) {
// Make sure the progress view is fully visible
mProgress.setAlpha(MAX_ALPHA);
mProgress.start();
if (mNotify) {
if (mListener != null) {
mListener.onRefresh();
}
}
mCurrentTargetOffsetTop = mCircleView.getTop();
} else {
reset();
}
}else{
if(mOnLoadListener != null){
mOnLoadListener.onLoad();
}
}
}
};
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
if (!isEnabled() || canChildScrollDown()) {
// Fail fast if we're not in a state where a swipe is possible
return super.dispatchTouchEvent(ev);
}
switch (action) {
case MotionEvent.ACTION_DOWN:
mIsBeingDragged = false;
mInitialDownY = ev.getY();
break;
case MotionEvent.ACTION_MOVE: {
final float y = ev.getY();
final float overscrollTop = (mInitialDownY -y) * DRAG_RATE;
if (overscrollTop > mTouchSlop) {
mIsBeingDragged = true;
if(!isLoading){
isLoading = true;
setProgressViewOffset(true, getBottom() - mCircleView.getHeight(), (int)(getBottom() - mCircleView.getHeight() - mTotalDragDistance));
}
moveSpinner(overscrollTop);
return true;
}
break;
}
case MotionEventCompat.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP: {
if (mIsBeingDragged) {
final float y = ev.getY();
final float overscrollTop = (mInitialDownY - y) * DRAG_RATE;
mIsBeingDragged = false;
finishSpinner(overscrollTop);
return true;
}
}
}
return super.dispatchTouchEvent(ev);
}
private boolean canChildScrollDown() {
return ViewCompat.canScrollVertically(mTarget, 1);
}
public void setLoading(boolean loading) {
if (mTarget == null) return;
isLoading = loading;
if (loading) {
if (isRefreshing()) {
super.setRefreshing(true);
}
mOnLoadListener.onLoad();
} else {
super.setRefreshing(false);
setProgressViewOffset(true,getTop(),(int)(DEFAULT_CIRCLE_TARGET * DisplayUtil.SCREEN_DENSITY));
mInitialDownY = 0;
}
}
@Override
public void setRefreshing(boolean refreshing) {
if(isLoading){
setLoading(refreshing);
}else{
super.setRefreshing(refreshing);
}
if(!refreshing){
setProgressViewOffset(true,-mCircleView.getHeight(), DEFAULT_CIRCLE_TARGET);
}
}
public void setOnLoadListener(OnLoadListener loadListener) {
mOnLoadListener = loadListener;
}
public interface OnLoadListener {
public void onLoad();
}
}